#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int Maxn=2e5+6;
int id,n;
vector<int>e[Maxn];
int ans;

bool vis[Maxn];
int dis[Maxn],lst[Maxn];

inline int bfs(int s){
	queue<int>q;
	for(int i=1;i<=n;i++) vis[i]=0;
	q.push(s); dis[s]=0; vis[s]=1;
	while(!q.empty()){
		int u=q.front(); q.pop();
		for(auto v:e[u]){
			if(!vis[v]){
				dis[v]=dis[u]+1;
				q.push(v); vis[v]=1;
				lst[v]=u;
			}
		}
	}
	int t=0;
	for(int i=1;i<=n;i++) if(dis[i]>dis[t]) t=i;
	return t;
}

int main(){
	freopen("forest.in","r",stdin);
	freopen("forest.out","w",stdout); 

	scanf("%d%d",&id,&n);
	
	if(id==9){
		for(int i=2;i<=n;i++){
			printf("%d\n",i-1);
		}
		return 0;
	}
	
	for(int i=2;i<=n;i++){
		int p; scanf("%d",&p); p^=ans;
		e[p].emplace_back(i);
		e[i].emplace_back(p);
		int s=bfs(1),t=bfs(s);
		queue<int>q; int ans1=dis[t],ret=0;
		for(int j=1;j<=n;j++) dis[j]=0,vis[j]=0;
		for(int j=t;j!=s;j=lst[j]) q.push(j),vis[j]=1; 
		q.push(s); vis[s]=1;
				
		while(!q.empty()){
			int u=q.front(); q.pop();
			for(auto v:e[u]){
				if(!vis[v]){
					dis[v]=dis[u]+1;
					q.push(v); vis[v]=1;
				}
			}
		}
		for(int j=1;j<=n;j++) ret=max(ret,dis[j]-1);
		ans=ans1+ret;
		printf("%d\n",ans); 
	}

	return 0;
}
/*
0 5
1 0 0 2
*/
